home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / Borland Visual dBASE Professiona v7.0 / DATA1.CAB / Sample_dBASE / Calculator.wfm < prev    next >
Text File  |  1997-11-20  |  38KB  |  1,484 lines

  1. //------------------------------------------------------------------------
  2. //
  3. //  Calculator.wfm  --  Calculator
  4. //
  5. //  This file contains a calculator form.  This calculator
  6. //  contains pushbuttons for numeric input and operations.  It 
  7. //  also contains 2 entryfields -- the main display, showing the 
  8. //  current calculation, a hidden entry field for storing values 
  9. //  to memory. Keyboard input is handled through a paintbox control
  10. //  that is not visible to the user.
  11. //
  12. //  Dependencies: Calculator.ICO 
  13. //  
  14. //  Visual dBASE Samples Group
  15. //
  16. //  $Revision:   1.10  $
  17. //
  18. //  Copyright (c) 1997, Borland International, Inc. 
  19. //  All rights reserved.
  20. //
  21. //------------------------------------------------------------------------
  22. //
  23.  
  24.  
  25. #define BASE_HEX             16
  26. #define BASE_DEC             10
  27. #define BASE_OCT              8
  28. #define BASE_BIN              2
  29.  
  30. #define MAX_DIGITS_DEC       18
  31. #define MAX_DIGITS_OCT       16
  32. #define MAX_DIGITS_BIN       16
  33. #define MAX_DIGITS_HEX        8
  34. #define DISPLAY_LEN          18
  35. #define HEX_OVERFLOW       2^32
  36. #define DEC_OVERFLOW      10^18
  37. #define ALLTRIM(x)        LTRIM(RTRIM(x))
  38.  
  39. set talk off
  40. local f
  41. ** END HEADER -- do not remove this line
  42. //
  43. // Generated on 11/10/97
  44. //
  45. parameter bModal
  46. local f
  47. f = new CALCULATORFORM()
  48. if (bModal)
  49.    f.mdi = false // ensure not MDI
  50.    f.readModal()
  51. else
  52.    f.open()
  53. endif
  54.  
  55. class CALCULATORFORM of FORM
  56.    with (this)
  57.       onGotFocus = class::FORM_ONGOTFOCUS
  58.       onClose = class::FORM_ONCLOSE
  59.       open = class::FORM_OPEN
  60.       scaleFontSize = 8
  61.       scaleFontBold = false
  62.       colorNormal = "BTNTEXT/BTNFACE"
  63.       height = 13.0455
  64.       left = 16
  65.       top = 3
  66.       width = 42.5714
  67.       text = "Calculator"
  68.       mdi = false
  69.       sizeable = false
  70.       mousePointer = 1    // Arrow
  71.       maximize = false
  72.       icon = "FILE Calculator.ico"
  73.    endwith
  74.  
  75.  
  76.    this.RECTANGLE1 = new RECTANGLE(this)
  77.    with (this.RECTANGLE1)
  78.       left = 1
  79.       top = 2.3182
  80.       width = 41
  81.       height = 1.25
  82.       metric = 0    // Chars
  83.       text = ""
  84.       colorNormal = "WindowText/BtnFace"
  85.       fontSize = 8
  86.    endwith
  87.  
  88.  
  89.    this.KEYHANDLER = new PAINTBOX(this)
  90.    with (this.KEYHANDLER)
  91.       onChar = class::KEYHANDLER_ONCHAR
  92.       colorNormal = "BtnFace/BtnFace"
  93.       height = 0.5
  94.       left = 0.1
  95.       top = 0.5
  96.       width = 0.1
  97.       metric = 0    // Chars
  98.    endwith
  99.  
  100.  
  101.    this.MEMORY = new ENTRYFIELD(this)
  102.    with (this.MEMORY)
  103.       enabled = false
  104.       height = 1
  105.       left = 1
  106.       top = 11.5
  107.       width = 41
  108.       metric = 0    // Chars
  109.       function = "J"
  110.       colorNormal = "BtnText/BtnFace"
  111.       colorHighLight = ""
  112.       fontSize = 8
  113.       value = "                  "
  114.       validRequired = true
  115.       borderStyle = 7    // Client
  116.    endwith
  117.  
  118.  
  119.    this.B7 = new PUSHBUTTON(this)
  120.    with (this.B7)
  121.       onClick = class::DIGIT_ONCLICK
  122.       height = 1
  123.       left = 1
  124.       top = 4
  125.       width = 6
  126.       text = "7"
  127.       metric = 0    // Chars
  128.       speedBar = true
  129.       fontSize = 8
  130.       group = true
  131.       colorNormal = "B/BtnFace"
  132.       value = false
  133.    endwith
  134.  
  135.  
  136.    this.B8 = new PUSHBUTTON(this)
  137.    with (this.B8)
  138.       onClick = class::DIGIT_ONCLICK
  139.       height = 1
  140.       left = 8
  141.       top = 4
  142.       width = 6
  143.       text = "8"
  144.       metric = 0    // Chars
  145.       speedBar = true
  146.       fontSize = 8
  147.       group = true
  148.       colorNormal = "B/BtnFace"
  149.       value = false
  150.    endwith
  151.  
  152.  
  153.    this.B9 = new PUSHBUTTON(this)
  154.    with (this.B9)
  155.       onClick = class::DIGIT_ONCLICK
  156.       height = 1
  157.       left = 15
  158.       top = 4
  159.       width = 6
  160.       text = "9"
  161.       metric = 0    // Chars
  162.       speedBar = true
  163.       fontSize = 8
  164.       group = true
  165.       colorNormal = "B/BtnFace"
  166.       value = false
  167.    endwith
  168.  
  169.  
  170.    this.B4 = new PUSHBUTTON(this)
  171.    with (this.B4)
  172.       onClick = class::DIGIT_ONCLICK
  173.       height = 1
  174.       left = 1
  175.       top = 5.5
  176.       width = 6
  177.       text = "4"
  178.       metric = 0    // Chars
  179.       speedBar = true
  180.       fontSize = 8
  181.       group = true
  182.       colorNormal = "B/BtnFace"
  183.       value = false
  184.    endwith
  185.  
  186.  
  187.    this.B5 = new PUSHBUTTON(this)
  188.    with (this.B5)
  189.       onClick = class::DIGIT_ONCLICK
  190.       height = 1
  191.       left = 8
  192.       top = 5.5
  193.       width = 6
  194.       text = "5"
  195.       metric = 0    // Chars
  196.       speedBar = true
  197.       fontSize = 8
  198.       group = true
  199.       colorNormal = "B/BtnFace"
  200.       value = false
  201.    endwith
  202.  
  203.  
  204.    this.B6 = new PUSHBUTTON(this)
  205.    with (this.B6)
  206.       onClick = class::DIGIT_ONCLICK
  207.       height = 1
  208.       left = 15
  209.       top = 5.5
  210.       width = 6
  211.       text = "6"
  212.       metric = 0    // Chars
  213.       speedBar = true
  214.       fontSize = 8
  215.       group = true
  216.       colorNormal = "B/BtnFace"
  217.       value = false
  218.    endwith
  219.  
  220.  
  221.    this.B1 = new PUSHBUTTON(this)
  222.    with (this.B1)
  223.       onClick = class::DIGIT_ONCLICK
  224.       height = 1
  225.       left = 1
  226.       top = 7
  227.       width = 6
  228.       text = "1"
  229.       metric = 0    // Chars
  230.       speedBar = true
  231.       fontSize = 8
  232.       group = true
  233.       colorNormal = "B/BtnFace"
  234.       value = false
  235.    endwith
  236.  
  237.  
  238.    this.B2 = new PUSHBUTTON(this)
  239.    with (this.B2)
  240.       onClick = class::DIGIT_ONCLICK
  241.       height = 1
  242.       left = 8
  243.       top = 7
  244.       width = 6
  245.       text = "2"
  246.       metric = 0    // Chars
  247.       speedBar = true
  248.       fontSize = 8
  249.       group = true
  250.       colorNormal = "B/BtnFace"
  251.       value = false
  252.    endwith
  253.  
  254.  
  255.    this.B3 = new PUSHBUTTON(this)
  256.    with (this.B3)
  257.       onClick = class::DIGIT_ONCLICK
  258.       height = 1
  259.       left = 15
  260.       top = 7
  261.       width = 6
  262.       text = "3"
  263.       metric = 0    // Chars
  264.       speedBar = true
  265.       fontSize = 8
  266.       group = true
  267.       colorNormal = "B/BtnFace"
  268.       value = false
  269.    endwith
  270.  
  271.  
  272.    this.OPPLUSMINUS = new PUSHBUTTON(this)
  273.    with (this.OPPLUSMINUS)
  274.       onClick = class::OPPLUSMINUS_ONCLICK
  275.       height = 1
  276.       left = 29
  277.       top = 7
  278.       width = 6
  279.       text = "+/-"
  280.       metric = 0    // Chars
  281.       speedBar = true
  282.       fontSize = 8
  283.       group = true
  284.       colorNormal = "BtnText/BtnFace"
  285.       value = false
  286.    endwith
  287.  
  288.  
  289.    this.B0 = new PUSHBUTTON(this)
  290.    with (this.B0)
  291.       onClick = class::DIGIT_ONCLICK
  292.       height = 1
  293.       left = 1
  294.       top = 8.5
  295.       width = 6
  296.       text = "0"
  297.       metric = 0    // Chars
  298.       speedBar = true
  299.       fontSize = 8
  300.       group = true
  301.       colorNormal = "B/BtnFace"
  302.       value = false
  303.    endwith
  304.  
  305.  
  306.    this.PERIOD = new PUSHBUTTON(this)
  307.    with (this.PERIOD)
  308.       onClick = class::PERIOD_ONCLICK
  309.       height = 1
  310.       left = 8
  311.       top = 8.5
  312.       width = 6
  313.       text = ". "
  314.       metric = 0    // Chars
  315.       speedBar = true
  316.       fontSize = 8
  317.       group = true
  318.       colorNormal = "B/BtnFace"
  319.       value = false
  320.    endwith
  321.  
  322.  
  323.    this.OPPOWER = new PUSHBUTTON(this)
  324.    with (this.OPPOWER)
  325.       onClick = class::OPCLICK
  326.       height = 1
  327.       left = 29
  328.       top = 5.5
  329.       width = 6
  330.       text = "^"
  331.       metric = 0    // Chars
  332.       speedBar = true
  333.       fontSize = 8
  334.       group = true
  335.       colorNormal = "BtnText/BtnFace"
  336.       value = false
  337.    endwith
  338.  
  339.  
  340.    this.OPTIMES = new PUSHBUTTON(this)
  341.    with (this.OPTIMES)
  342.       onClick = class::OPCLICK
  343.       height = 1
  344.       left = 22
  345.       top = 5.5
  346.       width = 6
  347.       text = "X"
  348.       metric = 0    // Chars
  349.       speedBar = true
  350.       fontSize = 8
  351.       group = true
  352.       colorNormal = "darkgreen/BtnFace"
  353.       value = false
  354.    endwith
  355.  
  356.  
  357.    this.OPDIV = new PUSHBUTTON(this)
  358.    with (this.OPDIV)
  359.       onClick = class::OPCLICK
  360.       height = 1
  361.       left = 22
  362.       top = 4
  363.       width = 6
  364.       text = "/"
  365.       metric = 0    // Chars
  366.       speedBar = true
  367.       fontSize = 8
  368.       group = true
  369.       colorNormal = "darkgreen/BtnFace"
  370.       value = false
  371.    endwith
  372.  
  373.  
  374.    this.OPMINUS = new PUSHBUTTON(this)
  375.    with (this.OPMINUS)
  376.       onClick = class::OPCLICK
  377.       height = 1
  378.       left = 22
  379.       top = 7
  380.       width = 6
  381.       text = "-"
  382.       metric = 0    // Chars
  383.       speedBar = true
  384.       fontSize = 8
  385.       group = true
  386.       colorNormal = "darkgreen/BtnFace"
  387.       value = false
  388.    endwith
  389.  
  390.  
  391.    this.BUTTONCLEAR = new PUSHBUTTON(this)
  392.    with (this.BUTTONCLEAR)
  393.       onClick = class::BUTTONCLEAR_ONCLICK
  394.       height = 1
  395.       left = 29
  396.       top = 4
  397.       width = 6
  398.       text = "CE\C"
  399.       metric = 0    // Chars
  400.       speedBar = true
  401.       fontSize = 8
  402.       group = true
  403.       colorNormal = "WHITE/RED"
  404.       value = false
  405.    endwith
  406.  
  407.  
  408.    this.OPEQUAL = new PUSHBUTTON(this)
  409.    with (this.OPEQUAL)
  410.       onClick = class::OPCLICK
  411.       height = 1
  412.       left = 15
  413.       top = 8.5
  414.       width = 6
  415.       text = "="
  416.       metric = 0    // Chars
  417.       speedBar = true
  418.       fontSize = 8
  419.       group = true
  420.       colorNormal = "Darkgreen/BtnFace"
  421.       value = false
  422.    endwith
  423.  
  424.  
  425.    this.OPPLUS = new PUSHBUTTON(this)
  426.    with (this.OPPLUS)
  427.       onClick = class::OPCLICK
  428.       height = 1
  429.       left = 22
  430.       top = 8.5
  431.       width = 6
  432.       text = "+"
  433.       metric = 0    // Chars
  434.       speedBar = true
  435.       fontSize = 8
  436.       group = true
  437.       colorNormal = "darkgreen/BtnFace"
  438.       value = false
  439.    endwith
  440.  
  441.  
  442.    this.MADD = new PUSHBUTTON(this)
  443.    with (this.MADD)
  444.       onClick = class::MEM_ONCLICK
  445.       height = 1
  446.       left = 36
  447.       top = 4
  448.       width = 6
  449.       text = "M+"
  450.       metric = 0    // Chars
  451.       speedBar = true
  452.       fontSize = 8
  453.       group = true
  454.       colorNormal = "WHITE/BLUE"
  455.       value = false
  456.    endwith
  457.  
  458.  
  459.    this.MSUB = new PUSHBUTTON(this)
  460.    with (this.MSUB)
  461.       onClick = class::MEM_ONCLICK
  462.       height = 1
  463.       left = 36
  464.       top = 5.5
  465.       width = 6
  466.       text = "M-"
  467.       metric = 0    // Chars
  468.       speedBar = true
  469.       fontSize = 8
  470.       group = true
  471.       colorNormal = "WHITE/BLUE"
  472.       value = false
  473.    endwith
  474.  
  475.  
  476.    this.MR = new PUSHBUTTON(this)
  477.    with (this.MR)
  478.       onClick = class::MR_ONCLICK
  479.       height = 1
  480.       left = 36
  481.       top = 7
  482.       width = 6
  483.       text = "MR"
  484.       metric = 0    // Chars
  485.       speedBar = true
  486.       fontSize = 8
  487.       group = true
  488.       colorNormal = "WHITE/BLUE"
  489.       value = false
  490.    endwith
  491.  
  492.  
  493.    this.MC = new PUSHBUTTON(this)
  494.    with (this.MC)
  495.       onClick = class::MC_ONCLICK
  496.       height = 1
  497.       left = 36
  498.       top = 8.5
  499.       width = 6
  500.       text = "MC"
  501.       metric = 0    // Chars
  502.       speedBar = true
  503.       fontSize = 8
  504.       group = true
  505.       colorNormal = "WHITE/BLUE"
  506.       value = false
  507.    endwith
  508.  
  509.  
  510.    this.B_A = new PUSHBUTTON(this)
  511.    with (this.B_A)
  512.       onClick = class::DIGIT_ONCLICK
  513.       height = 1
  514.       left = 1
  515.       top = 10
  516.       width = 6
  517.       text = "A"
  518.       metric = 0    // Chars
  519.       speedBar = true
  520.       fontSize = 8
  521.       group = true
  522.       colorNormal = "Blue/BtnFace"
  523.       value = false
  524.    endwith
  525.  
  526.  
  527.    this.B_B = new PUSHBUTTON(this)
  528.    with (this.B_B)
  529.       onClick = class::DIGIT_ONCLICK
  530.       height = 1
  531.       left = 8
  532.       top = 10
  533.       width = 6
  534.       text = "B"
  535.       metric = 0    // Chars
  536.       speedBar = true
  537.       fontSize = 8
  538.       group = true
  539.       colorNormal = "Blue/BtnFace"
  540.       value = false
  541.    endwith
  542.  
  543.  
  544.    this.B_C = new PUSHBUTTON(this)
  545.    with (this.B_C)
  546.       onClick = class::DIGIT_ONCLICK
  547.       height = 1
  548.       left = 15
  549.       top = 10
  550.       width = 6
  551.       text = "C"
  552.       metric = 0    // Chars
  553.       speedBar = true
  554.       fontSize = 8
  555.       group = true
  556.       colorNormal = "Blue/BtnFace"
  557.       value = false
  558.    endwith
  559.  
  560.  
  561.    this.B_D = new PUSHBUTTON(this)
  562.    with (this.B_D)
  563.       onClick = class::DIGIT_ONCLICK
  564.       height = 1
  565.       left = 22
  566.       top = 10
  567.       width = 6
  568.       text = "D"
  569.       metric = 0    // Chars
  570.       speedBar = true
  571.       fontSize = 8
  572.       group = true
  573.       colorNormal = "Blue/BtnFace"
  574.       value = false
  575.    endwith
  576.  
  577.  
  578.    this.B_E = new PUSHBUTTON(this)
  579.    with (this.B_E)
  580.       onClick = class::DIGIT_ONCLICK
  581.       height = 1
  582.       left = 29
  583.       top = 10
  584.       width = 6
  585.       text = "E"
  586.       metric = 0    // Chars
  587.       speedBar = true
  588.       fontSize = 8
  589.       group = true
  590.       colorNormal = "Blue/BtnFace"
  591.       value = false
  592.    endwith
  593.  
  594.  
  595.    this.B_F = new PUSHBUTTON(this)
  596.    with (this.B_F)
  597.       onClick = class::DIGIT_ONCLICK
  598.       height = 1
  599.       left = 36
  600.       top = 10
  601.       width = 6
  602.       text = "F"
  603.       metric = 0    // Chars
  604.       speedBar = true
  605.       fontSize = 8
  606.       group = true
  607.       colorNormal = "Blue/BtnFace"
  608.       value = false
  609.    endwith
  610.  
  611.  
  612.    this.DISPLAY = new TEXT(this)
  613.    with (this.DISPLAY)
  614.       height = 1.6818
  615.       left = 6
  616.       top = 0.3182
  617.       width = 35
  618.       border = true
  619.       metric = 0    // Chars
  620.       colorNormal = "WHITE/BLACK"
  621.       marginHorizontal = 0.1905
  622.       alignVertical = 1    // Middle
  623.       alignHorizontal = 2    // Right
  624.       fontName = "Fixedsys"
  625.       fontSize = 9
  626.       text = "TEXT1"
  627.       borderStyle = 5    // Double
  628.    endwith
  629.  
  630.  
  631.    this.RADIOHEX = new RADIOBUTTON(this)
  632.    with (this.RADIOHEX)
  633.       onGotFocus = {; this.form.KEYHANDLER.setFocus()}
  634.       onChange = class::RADIOHEX_ONCHANGE
  635.       height = 0.8
  636.       left = 3
  637.       top = 2.6
  638.       width = 7
  639.       text = "Hex"
  640.       metric = 0    // Chars
  641.       colorNormal = "WindowText/BtnFace"
  642.       fontSize = 8
  643.       tabStop = false
  644.       group = true
  645.       value = false
  646.    endwith
  647.  
  648.  
  649.    this.RADIODEC = new RADIOBUTTON(this)
  650.    with (this.RADIODEC)
  651.       onGotFocus = {; this.form.KEYHANDLER.setFocus()}
  652.       onChange = class::RADIODEC_ONCHANGE
  653.       height = 0.8
  654.       left = 14
  655.       top = 2.6
  656.       width = 7
  657.       text = "Dec"
  658.       metric = 0    // Chars
  659.       colorNormal = "WindowText/BtnFace"
  660.       fontSize = 8
  661.       tabStop = false
  662.       group = false
  663.       value = true
  664.    endwith
  665.  
  666.  
  667.    this.RADIOOCT = new RADIOBUTTON(this)
  668.    with (this.RADIOOCT)
  669.       onGotFocus = {; this.form.KEYHANDLER.setFocus()}
  670.       onChange = class::RADIOOCT_ONCHANGE
  671.       height = 0.8
  672.       left = 24
  673.       top = 2.6
  674.       width = 7
  675.       text = "Oct"
  676.       metric = 0    // Chars
  677.       colorNormal = "WindowText/BtnFace"
  678.       fontSize = 8
  679.       tabStop = false
  680.       group = false
  681.       value = false
  682.    endwith
  683.  
  684.  
  685.    this.RADIOBIN = new RADIOBUTTON(this)
  686.    with (this.RADIOBIN)
  687.       onGotFocus = {; this.form.KEYHANDLER.setFocus()}
  688.       onChange = class::RADIOBIN_ONCHANGE
  689.       height = 0.8
  690.       left = 34
  691.       top = 2.6
  692.       width = 7
  693.       text = "Bin"
  694.       metric = 0    // Chars
  695.       colorNormal = "WindowText/BtnFace"
  696.       fontSize = 8
  697.       tabStop = false
  698.       group = false
  699.       value = false
  700.    endwith
  701.  
  702.  
  703.    this.OPSQRT = new PUSHBUTTON(this)
  704.    with (this.OPSQRT)
  705.       onClick = class::OPSQRT_ONCLICK
  706.       height = 1
  707.       left = 29
  708.       top = 8.5
  709.       width = 6
  710.       text = "sqrt"
  711.       metric = 0    // Chars
  712.       speedBar = true
  713.       fontSize = 8
  714.       group = true
  715.       colorNormal = "BtnText/BtnFace"
  716.       value = false
  717.    endwith
  718.  
  719.  
  720.    this.TEXTMINDICATOR = new TEXT(this)
  721.    with (this.TEXTMINDICATOR)
  722.       height = 1.7
  723.       left = 2
  724.       top = 0.3
  725.       width = 4
  726.       metric = 0    // Chars
  727.       colorNormal = "BtnText"
  728.       alignVertical = 1    // Middle
  729.       text = " "
  730.    endwith
  731.  
  732.  
  733.    function changeBase( newBase )
  734.       //
  735.       // Change base number system
  736.       //
  737.       local value, memValue, dispFraction, memFraction
  738.  
  739.       // Get values in display and memory before changing 
  740.       // hex indicator
  741.       value    = CLASS::numVal( this.form.display.text )
  742.       memValue = CLASS::numVal( this.form.memory.value )
  743.       this.form.beforePeriod = true
  744.       SET DECIMALS TO this.form.decPlaces
  745.  
  746.       dispFraction = val(substr( this.form.display.text,;
  747.              at(this.form.periodChar, this.form.display.text)))
  748.       memFraction  = val(substr(form.memory.value,;
  749.              at(this.form.periodChar, this.form.memory.value)))
  750.  
  751.       this.form.numberSys := newBase 
  752.  
  753.       if ( abs(value) >= HEX_OVERFLOW )
  754.          // Temporary
  755.          this.form.display.text := space(DISPLAY_LEN - MAX_DIGITS_HEX) +;
  756.                              replicate("*", MAX_DIGITS_HEX)
  757.       else
  758.          this.form.display.text := CLASS::charVal( value + dispFraction )
  759.       endif
  760.  
  761.       if ( abs(memValue) >= HEX_OVERFLOW )
  762.          this.form.memory.value  := space(DISPLAY_LEN - MAX_DIGITS_HEX) +;
  763.                              replicate("*", MAX_DIGITS_HEX)
  764.       else
  765.          this.form.memory.value := CLASS::charVal( memValue + memFraction )
  766.       endif
  767.  
  768.    return ( this.form.numberSys )
  769.  
  770.  
  771.    // {Linked Method} form.b0.onClick
  772.    // {Linked Method} form.b3.onClick
  773.    // {Linked Method} form.b2.onClick
  774.    // {Linked Method} form.b1.onClick
  775.    // {Linked Method} form.b6.onClick
  776.    // {Linked Method} form.b5.onClick
  777.    // {Linked Method} form.b4.onClick
  778.    // {Linked Method} form.b9.onClick
  779.    // {Linked Method} form.b8.onClick
  780.    // {Linked Method} form.b7.onClick
  781.    // {Linked Method} form.b_f.onClick
  782.    // {Linked Method} form.b_e.onClick
  783.    // {Linked Method} form.b_d.onClick
  784.    // {Linked Method} form.b_c.onClick
  785.    // {Linked Method} form.b_b.onClick
  786.    // {Linked Method} form.b_a.onClick
  787.    function digit_onClick
  788.    return ( class::enterDigit( this.text ) )
  789.  
  790.    // {Linked Method} form.opplusminus.onClick
  791.    function OPPLUSMINUS_onClick
  792.       //
  793.       // Toggle sign of number in display.
  794.       //
  795.  
  796.       local num
  797.  
  798.       num = class::NumVal( this.form.display.text )
  799.       with ( this.form )
  800.          display.text := class::charVal(num * -1)
  801.          lastKeyOperator := false
  802.       endwith
  803.    return ( this.form.display.text )
  804.  
  805.    // {Linked Method} form.opsqrt.onClick
  806.    function OPSQRT_onClick
  807.       //
  808.       // Replace current diplay with square root of display.
  809.       //
  810.  
  811.       local num, sText
  812.       num = class::NumVal( this.form.display.text )
  813.       if ( num < 0 )
  814.          this.form.display.text := REPLICATE( "*", MAX_DIGITS_DEC )
  815.       else
  816.          this.form.display.text := class::CharVal( SQRT( num ) )
  817.       endif
  818.       this.form.lastKeyOperator := false
  819.    return ( this.form.display.text )
  820.  
  821.    function enterDigit( sDigit )
  822.       //
  823.       // Process a digit.
  824.       //
  825.       local num
  826.  
  827.       if ( this.form.lastKeyOperator )
  828.          with ( this.form )
  829.             lastKeyOperator := false
  830.             beforePeriod    := true
  831.             display.text    := space(MAX_DIGITS_DEC - 1) +;
  832.                                class::displayValue( sDigit )
  833.          endwith
  834.       else
  835.    
  836.          do case
  837.             case class::displayFull()
  838.                  ?? chr(7)
  839.             case this.form.beforePeriod
  840.                  // Only want rightmost DISPLAY_LEN characters
  841.                  this.form.display.text := ;
  842.                     right( class::displayValue( this.form.display.text ) + ;
  843.                            class::displayValue( sDigit ), ;
  844.                            DISPLAY_LEN )
  845.             otherwise
  846.                  this.form.display.text := ;
  847.                     class::addAfterPeriod( class::displayValue( sDigit ) )
  848.          endcase
  849.  
  850.       endif
  851.  
  852.    return ( this.form.display.text )
  853.  
  854.    // {Linked Method} form.opequal.onClick
  855.    // {Linked Method} form.optimes.onClick
  856.    // {Linked Method} form.oppower.onClick
  857.    // {Linked Method} form.opplus.onClick
  858.    // {Linked Method} form.opminus.onClick
  859.    // {Linked Method} form.opdiv.onClick
  860.    function opClick
  861.    return ( class::enterOp( this ) )
  862.  
  863.    // {Linked Method} form.period.onClick
  864.    function PERIOD_onClick
  865.       //
  866.       // Process decimal point.
  867.       //
  868.  
  869.       if ( this.form.beforePeriod )
  870.          with ( this.form )
  871.              beforePeriod := false
  872.              decPlaces    := 1
  873.          endwith
  874.          set decimals to 1
  875.          if ( this.form.lastKeyOperator )
  876.             with ( this.form )
  877.                lastKeyOperator := false
  878.                display.text := ;
  879.                  space(MAX_DIGITS_DEC - 1) + this.form.periodChar
  880.             endwith
  881.          else
  882.             this.form.display.text := ;
  883.                class::AddAfterPeriod( this.form.periodChar )
  884.          endif
  885.       endif
  886.  
  887.    return ( this.form.display.text )
  888.  
  889.    function enterOp( thisOp )
  890.       //
  891.       // Process operator.
  892.       //
  893.       local lastOperation, lastOp, lastValue, tempOpList
  894.       if ( this.form.LastKeyOperator or ;
  895.            this.form.operationStack.isEmpty() )
  896.          this.form.lastValue := class::numVal( this.form.display.text )
  897.       else
  898.          // Process all previous operations with >= precedence
  899.          do while ( this.form.operationStack.prevPrecedenceGreaterOrEqual( ;
  900.                     thisOp.precedence ) )
  901.             lastOperation = this.form.operationStack.pop()
  902.  
  903.             if ( lastOperation.getPrecedence() > 0 ) // Don't process "="
  904.                lastOp    = lastOperation.getOp()
  905.                lastValue = lastOperation.getValue()
  906.                set decimals to this.form.mostDecPlaces
  907.                this.form.lastValue := ;
  908.                   lastOp( lastValue, class::numVal( this.form.display.text ) )
  909.                this.form.display.text := class::charVal( this.form.lastValue )
  910.                this.form.decPlaces    := 1
  911.                set decimals to 1
  912.             endif
  913.          enddo
  914.       endif
  915.       with ( this.form )
  916.          beforePeriod    := true
  917.          lastKeyOperator := true
  918.       endwith
  919.  
  920.       thisOp.opValue = class::numVal( this.form.display.text )
  921.       this.form.operationStack.push( ( thisOp ) )
  922.  
  923.    return ( thisOp.opValue )
  924.  
  925.    // {Linked Method} form.msub.onClick
  926.    // {Linked Method} form.madd.onClick
  927.    function mem_onClick
  928.       //
  929.       // Process a memory action button.
  930.       //
  931.  
  932.       local result
  933.  
  934.       result = this.doIt( class::numVal( this.form.memory.value ),;
  935.                           class::numVal( this.form.display.text ))
  936.       with ( this.form )
  937.          memory.value := class::CharVal(result)
  938.          textMindicator.text := "M"
  939.       endwith
  940.    return ( result )
  941.  
  942.    // {Linked Method} form.radiobin.onChange
  943.    function RADIOBIN_onChange       
  944.  
  945.       with ( this.form )
  946.          b2.enabled := ( not this.value )
  947.          b3.enabled := ( not this.value )
  948.          b4.enabled := ( not this.value )
  949.          b5.enabled := ( not this.value )
  950.          b6.enabled := ( not this.value )
  951.          b7.enabled := ( not this.value )
  952.          b8.enabled := ( not this.value )
  953.          b9.enabled := ( not this.value )
  954.       endwith
  955.  
  956.       if ( this.value )
  957.          class::changeBase( BASE_BIN )
  958.       endif
  959.  
  960.    return ( this.value )
  961.  
  962.    // {Linked Method} form.radiodec.onChange
  963.    function RADIODEC_onChange
  964.       // Enable keys applicable to decimal calculations
  965.       with ( this.form )
  966.          opPlusMinus.enabled := ( this.value )
  967.          period.enabled      := ( this.value )  
  968.       endwith
  969.  
  970.       if ( this.value )
  971.          class::changeBase( BASE_DEC )
  972.       endif
  973.  
  974.    return ( this.value )
  975.  
  976.    // {Linked Method} form.radiohex.onChange
  977.    function RADIOHEX_onChange      
  978.  
  979.       if ( this.value )
  980.          this.form.height := 11.5
  981.          class::changeBase( BASE_HEX )
  982.       else
  983.          this.form.height := 10
  984.       endif  
  985.    return ( this.value )
  986.  
  987.    // {Linked Method} form.radiooct.onChange
  988.    function RADIOOCT_onChange
  989.  
  990.       with ( this.form )
  991.          b8.enabled := ( not this.value )
  992.          b9.enabled := ( not this.value )
  993.       endwith
  994.  
  995.       if ( this.value )
  996.          class::changeBase( BASE_OCT )
  997.       endif
  998.  
  999.    return ( this.value )
  1000.  
  1001.    function displayFull
  1002.       //
  1003.       // Check if display already has MAX_DIGITS_DEC digits in it
  1004.       //
  1005.  
  1006.       local bFull, maxValueLen
  1007.       bFull       = false
  1008.       maxValueLen = MAX_DIGITS_DEC
  1009.       do case
  1010.          case ( this.form.numberSys == BASE_HEX )
  1011.               maxValueLen := MAX_DIGITS_HEX
  1012.          case ( this.form.numberSys == BASE_OCT )
  1013.               maxValueLen := MAX_DIGITS_OCT
  1014.          otherwise
  1015.               maxValueLen := MAX_DIGITS_DEC
  1016.       endcase
  1017.  
  1018.       // Check if leftmost digit in current display = " "
  1019.       bFull := ( not empty( left( right( this.form.display.text, ;
  1020.                                 maxValueLen ), 1) ) )
  1021.  
  1022.    return ( bFull )
  1023.  
  1024.    function addAfterPeriod(char)
  1025.       //
  1026.       // Add fractional digits after decimal point.
  1027.       //
  1028.       this.form.decPlaces := this.form.decPlaces + 1
  1029.       set decimals to this.form.decPlaces
  1030.       this.form.mostDecPlaces := max( this.form.decPlaces, ;
  1031.                                       this.form.mostDecPlaces )
  1032.  
  1033.    return ( class::DisplayValue( this.form.display.text ) + char )
  1034.  
  1035.    // {Linked Method} form.buttonclear.onClick
  1036.    function BUTTONCLEAR_onClick
  1037.       //
  1038.       // Set custom form properties to default values
  1039.       // and clear display..
  1040.       //
  1041.       this.form.operationStack.Initialize() // Empty operation stack         
  1042.       set decimals to 1                     // Initial decimal places
  1043.       with ( this.form )
  1044.            lastValue       := 0        // Clear value
  1045.            lastKeyOperator := null     // Clear operators
  1046.            decPlaces       := 1  
  1047.            mostDecPlaces   := 1
  1048.            beforePeriod    := true     // Start with whole number entry
  1049.            display.text    := SPACE( MAX_DIGITS_DEC - 1 ) + "0"
  1050.       endwith   
  1051.    return ( this.form.display.text )
  1052.  
  1053.    function displayValue( value )
  1054.       //
  1055.       //  Display value without the pick character.
  1056.       //
  1057.       local num, pickLoc
  1058.       num = value
  1059.       pickLoc = at("&",num)
  1060.  
  1061.       do case
  1062.          case ( pickLoc <> 0 )
  1063.               num := stuff(num,pickLoc,1,"")
  1064.          case ( right(num,2) = " 0" )
  1065.               num := space(MAX_DIGITS_DEC)
  1066.          case ( left(num,1) = SPACE(1) )
  1067.               num := substr(num,2)
  1068.        endcase
  1069.  
  1070.    return ( num )
  1071.  
  1072.    // {Linked Method} form.onClose
  1073.    function Form_onClose
  1074.       //
  1075.       // Clean up
  1076.       //
  1077.       CLOSE PROCEDURE PROGRAM(1)
  1078.    return ( true )
  1079.  
  1080.    // {Linked Method} form.onGotFocus
  1081.    function Form_onGotFocus
  1082.       //
  1083.       // Make sure decimal places is correct every time 
  1084.       // this form gets focus.
  1085.       //
  1086.       set decimals to this.decPlaces
  1087.    return ( SET("DECIMALS") )
  1088.  
  1089.    // {Linked Method} form.keyhandler.onChar
  1090.    function KEYHANDLER_onChar(nChar, nRepCnt, nFlags)
  1091.       local sChar, vChar
  1092.       sChar = UPPER( CHR( nChar ) )
  1093.       vChar = VAL( sChar )
  1094.       if ( vChar > 0 AND vChar < this.form.numberSys )
  1095.          class::enterDigit( sChar )
  1096.       else
  1097.          do case
  1098.             case ( sChar == "0" )
  1099.                  class::enterDigit( sChar )
  1100.             case ( sChar == "/" )
  1101.                  class::enterOp( this.form.opDiv )
  1102.             case ( sChar == "*" OR sChar == "X"  )
  1103.                  class::enterOp( this.form.opTimes )
  1104.             case ( sChar == "-" )
  1105.                  class::enterOp( this.form.opMinus )
  1106.             case ( sChar == "+" )
  1107.                  class::enterOp( this.form.opPlus )
  1108.             case ( sChar == "^" )
  1109.                  class::enterOp( this.form.opPower )
  1110.             case ( sChar == "=" OR nChar == 13 )
  1111.                  class::enterOp( this.form.opEqual )
  1112.             case ( sChar == "." and this.form.period.enabled )
  1113.                  class::period_OnClick()
  1114.          endcase
  1115.       endif
  1116.    return (nChar)
  1117.  
  1118.    // {Linked Method} form.mc.onClick
  1119.    function MC_onClick      
  1120.       //
  1121.       // Memory Clear
  1122.       //
  1123.       local thisForm
  1124.       if ( TYPE("this.form") == "O" )
  1125.          thisForm = this.form
  1126.       else
  1127.          thisForm = this
  1128.       endif
  1129.       with ( thisForm )
  1130.          lastKeyOperator     := true
  1131.          memory.value        := space(MAX_DIGITS_DEC - 1) + "0"
  1132.          textMIndicator.text := null
  1133.       endwith
  1134.    return ( thisForm.memory.value )
  1135.  
  1136.    // {Linked Method} form.mr.onClick
  1137.    function MR_onClick
  1138.       //
  1139.       // Recall from memory.
  1140.       //
  1141.  
  1142.       if ( this.form.lastKeyOperator )
  1143.          with ( this.form )
  1144.             lastKeyOperator := false
  1145.             beforePeriod    := true    
  1146.          endwith
  1147.       endif
  1148.       this.form.lastValue    := class::numVal( this.form.display.text )
  1149.       this.form.display.text := this.form.memory.value
  1150.    return ( this.form.display.text )
  1151.  
  1152.    // {Linked Method} form.open
  1153.    function Form_open
  1154.       set procedure to program(1) additive
  1155.       set decimals  to 1 
  1156.       this.height := 10 // hide hex 
  1157.  
  1158.       this.periodChar = setto("point")  // Set point type for 
  1159.       this.period.text := this.periodChar // current country
  1160.  
  1161.       this.opPlus.doIt        = { |a,b| ; return ( a + b ) }
  1162.       this.opPlus.precedence  = 1
  1163.  
  1164.       this.opMinus.doIt       = { |a,b| ; return ( a - b ) }
  1165.       this.opMinus.precedence = 1
  1166.  
  1167.       this.opTimes.doIt       = { |a,b| ; return ( a * b ) }
  1168.       this.opTimes.precedence = 2
  1169.  
  1170.       this.opDiv.doIt         = class::OpDivideIt
  1171.       this.opDiv.precedence   = 2
  1172.  
  1173.       this.opPower.doIt       = { |a,b| ; return ( a ^ b ) }
  1174.       this.opPower.precedence = 3
  1175.  
  1176.       this.opEqual.doIt       = { |a,b| ; return null }
  1177.       this.opEqual.precedence = 0
  1178.  
  1179.       this.mAdd.doIt          = { |a,b| ; return ( a + b ) }
  1180.       this.mAdd.precedence    = 1
  1181.  
  1182.       this.mSub.doIt          = { |a,b| ; return ( a - b ) }
  1183.       this.mSub.precedence    = 1
  1184.  
  1185.       //
  1186.       // Create custom form properties
  1187.       // 
  1188.       // Stack for storing operation states
  1189.       this.operationStack = new OperationStackClass()
  1190.       this.operationStack.Initialize() // Empty operation stack         
  1191.  
  1192.       this.numberSys = BASE_DEC 
  1193.       this.decPlaces      = 1    // Start with minimum decimal places
  1194.       this.mostDecPlaces  = 1    // Most decimal places in an operand
  1195.  
  1196.       this.beforePeriod    = true // Add numbers before or after decimal pt.
  1197.       this.lastKeyOperator = null
  1198.       this.lastValue       = 0        
  1199.       this.display.text := SPACE( MAX_DIGITS_DEC - 1 ) + "0"
  1200.       class::MC_onClick()
  1201.  
  1202.       this.KEYHANDLER.setFocus()
  1203.    return ( CALCULATORFORM::OPEN() )
  1204.  
  1205.    function opDivideIt( a, b )
  1206.       local nResult
  1207.       nResult = 0
  1208.       if ( b == 0 )
  1209.          MSGBOX("Cannot divide by zero.","Alert",48)
  1210.       else
  1211.          nResult := ( a / b )
  1212.       endif
  1213.    return ( nResult )
  1214.  
  1215.    function charVal( num )
  1216.       //
  1217.       // Convert decimal number to string using 
  1218.       // current base: hex, decimal, octal, binary.
  1219.       //
  1220.       local string, fractionVal
  1221.       local nPlace
  1222.       local nPValue
  1223.       string = ""
  1224.  
  1225.       do case
  1226.          case ( this.form.numberSys == BASE_HEX )
  1227.  
  1228.               if ( ABS(num) >= HEX_OVERFLOW )
  1229.                  string := replicate("*", MAX_DIGITS_HEX)
  1230.               else
  1231.                  string := itoh(num)
  1232.                  string := space(MAX_DIGITS_DEC - len(string)) + string
  1233.               endif
  1234.  
  1235.          case ( this.form.numberSys == BASE_OCT )
  1236.               string := class::toBaseString( num, 16, BASE_OCT )
  1237.  
  1238.          case ( this.form.numberSys == BASE_BIN )
  1239.               string := class::toBaseString( num, 16, BASE_BIN )
  1240.  
  1241.          case ( this.form.numberSys == BASE_DEC )
  1242.               if ( ABS(num) >= DEC_OVERFLOW )
  1243.                  string := replicate("*", MAX_DIGITS_DEC)
  1244.               else
  1245.                  string := str(num, MAX_DIGITS_DEC, this.form.decPlaces)
  1246.                  if ( VAL(right(string, this.form.decPlaces)) == 0 )  // If fraction = 0
  1247.                     string := str(num, MAX_DIGITS_DEC)
  1248.                  endif
  1249.               endif
  1250.  
  1251.       endcase
  1252.    return ( string )
  1253.  
  1254.    function toBaseString( nDecValue, nMaxPlace, nBase )
  1255.       local nPlace
  1256.       local npValue
  1257.       local nAdd
  1258.       local sValue
  1259.       local bStart
  1260.       local bCarry
  1261.  
  1262.       nPlace  = nMaxPlace
  1263.       npValue = 0
  1264.       sValue  = ""
  1265.       bStart  = false
  1266.       if ( ABS( nDecValue ) >= nBase ^ nPlace )
  1267.          sValue = REPLICATE("*", nMaxPlace )
  1268.       else                
  1269.          do while ( nPlace >= 0 )
  1270.             if ( nDecValue == 0 )
  1271.                sValue := sValue + "0"
  1272.             else
  1273.                npValue := ( nBase ^ nPlace )
  1274.                if ( ( npValue <= nDecValue ) or ;
  1275.                     ( npValue == 1 ) )
  1276.                   bStart := true
  1277.                   if ( nDecValue / npValue ) == nBase
  1278.                      sValue := sValue + "10"
  1279.                   else
  1280.                      sValue := sValue + ;
  1281.                               ALLTRIM( STR( INT( nDecValue / npValue )  ) )
  1282.                   endif
  1283.                   nDecValue := MOD( nDecValue, npValue )
  1284.                else
  1285.                   if ( bStart )
  1286.                      sValue := sValue + "0"
  1287.                   endif
  1288.                endif
  1289.             endif
  1290.             nPlace := nPlace - 1
  1291.          enddo
  1292.          if ( VAL( sValue ) == 0 )
  1293.             sValue := "0"
  1294.          endif
  1295.          sValue := SPACE( MAX_DIGITS_DEC - LEN( sValue ) ) + sValue
  1296.       endif
  1297.    return ( sValue )
  1298.  
  1299.    function numVal( string )
  1300.       //
  1301.       // Return decimal value of display value using
  1302.       // current base to translate.
  1303.       //
  1304.       local h, num, nPeriod
  1305.       local sValue
  1306.       local nDigit, nPlace
  1307.       private macro
  1308.  
  1309.       sValue  = ALLTRIM( string )
  1310.       h       = ""
  1311.       macro   = ""
  1312.       num     = 0
  1313.       nDigit  = 0
  1314.       nPlace  = 0
  1315.       nPeriod = 0
  1316.  
  1317.       do case
  1318.  
  1319.          case ( this.form.numberSys == BASE_HEX )
  1320.  
  1321.               h   := htoi(string)
  1322.               num := iif(h >= HEX_OVERFLOW/2, bitxor(h, HEX_OVERFLOW), h)
  1323.  
  1324.          case ( this.form.numberSys == BASE_OCT )
  1325.  
  1326.               if ( sValue == null )
  1327.                  num := 0
  1328.               else
  1329.                  if ( SUBSTR( sValue, 1, 1 ) == "*" )
  1330.                     num := ( 1 / 0 )
  1331.                  else
  1332.                     macro := "0" + sValue
  1333.                     num := ¯o.
  1334.                  endif
  1335.               endif
  1336.  
  1337.          case ( this.form.numberSys == BASE_BIN )
  1338.  
  1339.               do while ( LEN( sValue ) > 0 )
  1340.                  nDigit := IIF( RIGHT( sValue, 1 ) == "1", 1, 0 )
  1341.                  sValue := SUBSTR( sValue, 1, ( LEN( sValue ) - 1 ) )
  1342.                  num    := num + ( nDigit * (2 ^ nPlace) )
  1343.                  nPlace := nPlace + 1
  1344.               enddo
  1345.  
  1346.          otherwise            
  1347.  
  1348.               // decimal
  1349.               nPeriod := AT( this.form.periodChar, sValue )
  1350.  
  1351.               if ( nPeriod <> 0  )               
  1352.                  num := VAL( STUFF( sValue, nPeriod, 1, "." ) )
  1353.               else
  1354.                  num := VAL( sValue )
  1355.               endif
  1356.  
  1357.       endcase
  1358.  
  1359.    return ( num )
  1360. endclass
  1361. class OperationStackClass
  1362.    //
  1363.    // This class defines a stack object for storing 
  1364.    // mathematical operation states.  This is necessary 
  1365.    // for using operators that have different precedence, like
  1366.    // + and *.  This is a stack of OperationStateClass objects.
  1367.    //
  1368.    
  1369.    class::initialize()
  1370.  
  1371.  
  1372.    function initialize
  1373.       //
  1374.       // Create empty stack
  1375.       //
  1376.  
  1377.       // Bottom (and top, at first) of Stack
  1378.       this.stackTop = new OperationStateClass()
  1379.    return true
  1380.  
  1381.    function isEmpty
  1382.       //
  1383.       // Check if stack is empty
  1384.       //
  1385.  
  1386.    return empty( this.stackTop.getNext() ) // Empty if no more operations
  1387.  
  1388.  
  1389.    function pop
  1390.       //
  1391.       // Retrieve last operation state
  1392.       //
  1393.       local xOp
  1394.       xOp = false
  1395.  
  1396.       if ( empty(this.stackTop.getNext()) )
  1397.          InformationMessage("ERROR: Trying to pop empty stack", "Info")
  1398.       else
  1399.          xOp := this.stackTop
  1400.          this.stackTop = this.stackTop.getNext()
  1401.       endif
  1402.  
  1403.    return xOp
  1404.  
  1405.  
  1406.    function push( operation )
  1407.       //
  1408.       // Save last operation state
  1409.       //
  1410.       local newStackTop
  1411.  
  1412.       newStackTop = new operationStateClass()  // Create new operationState
  1413.       newStackTop.assign( operation )          // Assign to it properties of
  1414.                                                // operation
  1415.       newStackTop.setNext( this.stackTop )     // Make current top be next
  1416.  
  1417.       this.stackTop = newStackTop              // Make new operation be top
  1418.  
  1419.    return true
  1420.  
  1421.  
  1422.    function prevPrecedenceGreaterOrEqual(curPrecedence)
  1423.       //
  1424.       // Retrieve last operation state
  1425.       //
  1426.    return ( this.stackTop.getPrecedence() >= curPrecedence )
  1427.  
  1428. endclass
  1429.  
  1430.  
  1431. class OperationStateClass
  1432.    //
  1433.    // This class defines a single operation state, which is to 
  1434.    // be stored on the operationStack
  1435.    //
  1436.  
  1437.    this.op         = { |a,b| ; return null } 
  1438.    this.precedence = -1              
  1439.    this.opValue    = 0
  1440.    this.next       = false
  1441.  
  1442.    function getOp
  1443.    return ( this.op )
  1444.  
  1445.  
  1446.    function setOp( newOp )
  1447.       this.op := newOp
  1448.    return ( this.op )
  1449.  
  1450.  
  1451.    function getPrecedence
  1452.    return ( this.precedence )
  1453.  
  1454.  
  1455.    function setPrecedence( newPrecedence )
  1456.       this.precedence := newPrecedence
  1457.    return ( this.precedence )
  1458.  
  1459.  
  1460.    function getValue
  1461.    return ( this.opValue )
  1462.  
  1463.    function setValue( newValue )
  1464.       this.opValue := newValue
  1465.    return ( this.opValue )
  1466.  
  1467.  
  1468.    function getNext
  1469.    return ( this.next )
  1470.  
  1471.    function setNext(newNext)
  1472.       this.next := newNext
  1473.    return ( this.next )
  1474.  
  1475.    function assign( newOperationState )
  1476.       with ( this )
  1477.          op         := newOperationState.doIt
  1478.          precedence := newOperationState.precedence
  1479.          opValue    := newOperationState.opValue
  1480.       endwith
  1481.    return ( this.opValue )
  1482.  
  1483. endclass
  1484.